home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 5 / Gekikoh Dennoh Club Vol. 5 (Japan).7z / Gekikoh Dennoh Club Vol. 5 (Japan) (Track 01).bin / internet / webx / webxp040.lzh / Source / WebXpression.c < prev    next >
C/C++ Source or Header  |  1998-09-27  |  19KB  |  769 lines

  1. /* WebXpression.c */
  2. /* Not for communication, only for xpression... */
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <sys/dos.h>
  8. #include <sys/iocs.h>
  9. #include <sys/xglob.h>
  10. #include <unistd.h>
  11.  
  12. #include "WebXpression.h"
  13. #include "WebCache/WebCache.h"
  14. #include "FuncUrl/FuncUrl.h"
  15.  
  16. extern void InitHtml2Xpression (void);
  17. extern XPTEXT *Html2Xpression (HTTPFILE *, XPTEXT *);
  18. extern XPTEXT *Plain2Xpression (HTTPFILE *, XPTEXT *);
  19. extern void ReCheckLinkTable (XPTEXT *);
  20. extern int SearchAnchor (XPTEXT *, char *);
  21. extern void FreeXptext (XPTEXT *);
  22. extern void FreeXptext2 (XPTEXT *);
  23. extern int DispAll (XPTEXT *);
  24. extern void *TextVdisp (void);
  25. extern void DispBack (void);
  26. extern void ClearText (void);
  27. extern int GetFileInit (void);
  28. extern int GetFile (HTTPFILE *);
  29. extern int InitHistory (void);
  30. extern void AddHistory (char *, char *, int);
  31. extern char *BeforeHistory (char *, int *);
  32. extern int LoadImage (void);
  33. extern int cut_disp (void *, void *, int);
  34. extern void McInit (void);
  35. extern void McPrint (char *);
  36. extern void McDbPrint (char *);
  37. extern int InitConfig (char *);
  38. extern void show_mouse_cursor (void);
  39. extern void hide_mouse_cursor (void);
  40.  
  41. extern unsigned short in_link_num;
  42. extern IMAGE_LIST *image_list_top, *image_list_end, *image_list_ptr;
  43. extern char WebPage2;
  44. extern char WebPage3;
  45. extern unsigned short webcache_save;
  46. extern unsigned char hold_online;
  47. extern char text_editor[];
  48. extern char refresh_rate;
  49.  
  50. /* âXâ^âbâNâTâCâYé╞âqü[âvâTâCâYé≡ÄwÆΦ */
  51. int _stacksize = 32 * 1024;
  52. int _heapsize = 256 * 1024;
  53.  
  54. unsigned char d_option = 0;
  55. static unsigned char t_option = 0;
  56.  
  57.  
  58. static int old_screen_mode;
  59. static int old_fnkmod;
  60. static char address_book[92];    /* "file://" ì₧é▌é╠âAâhâîâXÆáâtâïâpâXâtâ@âCâïû╝ */
  61. struct _psp *mypsp;
  62. volatile signed char quit_flag;    /* â}âEâXé┼æÇì∞é│éΩé╜îïë╩üiQUIT_NON ôÖé¬ôⁿéΘüj */
  63. unsigned char freeze;        /* ëµû╩ò`ëµï╓Ä~âtâëâO */
  64. XPTEXT *disp_xptext;        /* ò\ĪÆåé╠ xptext */
  65. char kmode = K_AUTO;        /* ô·û{îΩò╢ÄÜâRü[âh */
  66.  
  67. extern unsigned short config_color[8];
  68. extern unsigned short html_color[8];
  69. unsigned short text_color[7];
  70. unsigned char from_network;
  71.  
  72.  
  73. #define TEXTVRAM    0xe00000
  74.  
  75. #define STR_DISP_COMPLETE    "äƒäƒäƒäƒäƒäƒäƒäƒäƒäƒäƒäƒ ò\Īè«ù╣ äƒ\n"
  76. static void Init2 (void);
  77. static void Tini2 (void);
  78.  
  79.  
  80. static void usage (void)
  81. {
  82.     printf (
  83.                "WWW âuâëâEâU WebXpression.x ver0.40\n"
  84.                "        programmed by Mitsuky <FreeSoftware>\n"
  85.                "Hyper Text Transfer Protocol é╔Å]é┴é─ HTML âtâ@âCâïé≡ò\Īé╡é▄é╖\n"
  86.                "âlâbâgâÅü[âNÅπé╠âtâ@âCâïé≡ò\Īé╖éΘÅΩìçüATCP/IP âhâëâCâoé¬òKùvé┼é╖\n"
  87.                "Ägùpû@ : WebXpression [option] [URL]\n"
  88.                "[option]\n"
  89.                "    -Câtâ@âCâïû╝ : .cnf âtâ@âCâïé≡ÄwÆΦ\n"
  90.                "    -D : âfâoâbâOâéü[âh\n"
  91.                "URL ûóÄwÆΦÄ₧é╔é═âAâhâîâXÆáé≡ò\Īé╡é▄é╖\n"
  92.     );
  93. }
  94.  
  95.  
  96.  
  97. #if    1
  98. /* [INTERRUPT] é¬ëƒé│éΩé╜éτé▒é▒é╔ö≥é±é┼é¡éΘ */
  99. static void interrupt_abort (void)
  100. {
  101.     quit_flag = QUIT_EXIT;
  102.     _iocs_vdispst (0, 0, 0);
  103. }
  104.  
  105. #endif
  106.  
  107.  
  108.  
  109. /* -d âIâvâVâçâôùp */
  110. static void DumpXptext (XPTEXT * xptext)
  111. {
  112.     LINE_PTR *l = xptext->line_ptr;
  113.     unsigned char *n, *p;
  114.     unsigned char c;
  115.     int i, line = 0;
  116.     do {
  117.         p = l->ptr;
  118.         n = p + l->num;
  119.  
  120.         while (p < n) {
  121.             c = *p++;
  122.             if (c == 0x09) {
  123.                 putchar (c);
  124.                 continue;
  125.             }
  126.             if (c < ' ') {
  127.                 continue;
  128.             }
  129.             if (c < 0x80) {
  130.                 putchar (c);
  131.                 continue;
  132.             } else {
  133.                 putchar (c);
  134.                 putchar (*p++);
  135.                 continue;
  136.             }
  137.         }
  138.         printf ("*** %hd", l->num);    /* ò╢ÄÜÉö */
  139.         //printf (",%hd", l->start_dot);
  140.         l++;
  141.         printf ("\n");
  142.     } while (++line < xptext->line);
  143.     printf ("âèâôâNâeü[âuâïé≡ò\Īé╡é▄é╖\n");
  144.     for (i = 0; i < xptext->link_table_max; i++) {
  145.         printf ("âèâôâN L%04d : %s\n", i, (xptext->link_table)[i]);
  146.     }
  147.     printf ("âCâüü[âWâèâXâgé≡ò\Īé╡é▄é╖\n");
  148.     {
  149.         IMAGE_LIST *t_ptr = image_list_top;
  150.  
  151.         while (t_ptr != NULL) {
  152.             printf ("âCâüü[âW : %s\n", t_ptr->url);
  153.             t_ptr = t_ptr->next_ptr;
  154.         }
  155.     }
  156. }
  157.  
  158.  
  159. /* âAâhâîâXÆáé╔Æ╟ë┴ */
  160. static int AddAddress (char *url, char *title)
  161. {
  162.     FILE *fp;
  163.  
  164.     /* file:// é≡ö≥é╬é╖é⌐éτ [7] */
  165.     if ((fp = fopen (&address_book[7], "a+")) != NULL) {
  166.         fprintf (fp, "<LI><A HREF=\"%s\">%s</A>\n", url, title);
  167.         fclose (fp);
  168.         McPrint ("âAâhâîâXÆáé╔ôoÿ^é╡é▄é╡é╜\n");
  169.     } else {
  170.         McPrint ("üª âAâhâîâXÆáé╔Åæé½ì₧é▀é▄é╣é±\n");
  171.     }
  172.  
  173.     return (0);
  174. }
  175.  
  176.  
  177.  
  178. /* âLü[ü^â}âEâXé╠â{â^âôé¬ùúé│éΩéΘé▄é┼æ╥é┬ */
  179. void WaitReleaseAll (void)
  180. {
  181.     int i;
  182.     do {
  183.         for (i = 0; i < 15; i++)
  184.             if (_iocs_bitsns (i))
  185.                 break;
  186.     } while ((i != 15) || (_iocs_ms_getdt ()& 0xffff));
  187. }
  188.  
  189.  
  190.  
  191. /* âüâCâôâïü[â`âô : ÅIù╣é╖éΘé▄é┼é▒é▒é┼âïü[âv */
  192. static int ShowHtml (char *in_url)
  193. {
  194.     HTTPFILE *httpfile = NULL, *old_httpfile = NULL;
  195.     XPTEXT *xptext = NULL, *old_xptext = NULL;
  196.     char load_complete = 0;
  197.     char url[256];
  198.     int sp;
  199.     int temp_line = 0;
  200.     unsigned short save_counter = 0;
  201.     int lap_time = 0;
  202.     char temp_refresh_rate = 0;
  203.  
  204.     strcpy (url, in_url);
  205.     quit_flag = QUIT_NON;
  206.     freeze = !0;        /* ëµû╩ìXÉVï╓Ä~ */
  207.  
  208.     do {
  209.         _dos_c_locate (0, 30);
  210.         switch (quit_flag) {
  211.         case QUIT_NON:    /* Æ╩ÅφÄ₧ */
  212.             if (xptext == NULL) {
  213.                 if ((int) (httpfile = _dos_malloc (sizeof (HTTPFILE))) < 0) {
  214.                     McDbPrint ("ShowHtml() : âüâéâèé¬æ½éΦé▄é╣é±\n");
  215.                     quit_flag = QUIT_EXIT;
  216.                     break;
  217.                 }
  218.                 httpfile->content = NULL;
  219.                 strcpy (httpfile->url, url);
  220.                 if (GetFile (httpfile) < 0) {
  221.                     McDbPrint ("ShowHtml() : ");
  222.                     McPrint (url);
  223.                     McPrint (" é¬ô╟é▌ì₧é▀é▄é╣é±é┼é╡é╜\n");
  224.                     _dos_mfree (httpfile);
  225.                     if (((httpfile = old_httpfile) != NULL) && ((xptext = old_xptext) != NULL))
  226.                         continue;
  227.                     else
  228.                         return (-1);
  229.                 }
  230.                 McDbPrint ("ShowHtml() : ");
  231.                 McPrint (url);
  232.                 McPrint (" é≡ô╟é▌ì₧é▌é▄é╡é╜\n");
  233.                 lap_time = _iocs_ontime ();
  234.                 temp_refresh_rate = 0;
  235.  
  236.                 /* <A HREF> é┼ .GIF/.JPG é¬ÄwÆΦé│éΩé╜Ä₧é═ */
  237.                 /* .HTM âtâ@âCâïé≡âüâéâèÅπé╔ì∞ɼ */
  238.                 if ((!strcmp (httpfile->content_type, "image/gif")) ||
  239.                     (!strcmp (httpfile->content_type, "image/jpeg"))) {
  240.                     char temp_content[1024];
  241.                     char scheme[256], hostname[256], path[256], fname[256], query[256],
  242.                       anchor[256];
  243.                     int port;
  244.                     _dos_mfree (httpfile->content);    /* ô╟é±é╛ëµæ£é═Ä╠é─éΘ */
  245.                     UrlSplit (url, scheme, hostname, path, fname, query, anchor, &port);
  246.                     sprintf (temp_content, "<HTML><HEAD><TITLE>%s</TITLE></HEAD><BODY><BR><CENTER><IMG SRC=\"%s\"></CENTER></BODY></HTML>\r\n\0",
  247.                          fname, url);
  248.                     httpfile->content_length = strlen (temp_content);
  249.                     httpfile->content = _dos_malloc (httpfile->content_length);
  250.                     strcpy (httpfile->content_type, "text/html");
  251.                     strcpy (httpfile->content, temp_content);
  252.                     strcpy (httpfile->url, url);
  253.                 }
  254.                 /* <A HREF> é┼ .DOC/.TXT é¬ÄwÆΦé│éΩé╜Ä₧ */
  255.                 if (!strcmp (httpfile->content_type, "text/plain")) {
  256.                     if ((xptext = Plain2Xpression (httpfile, NULL)) == NULL) {
  257.                         McDbPrint ("ShowHtml() : ");
  258.                         McPrint ("üª âeâLâXâgé╠ë≡É═é╔Ä╕ösé╡é▄é╡é╜\n");
  259.                         _dos_mfree (httpfile->content);
  260.                         _dos_mfree (httpfile);
  261.                         httpfile = NULL;
  262.                     }
  263.                 }
  264.                 /* <A HREF> é┼ .HTM é¬ÄwÆΦé│éΩé╜Ä₧ */
  265.                 if (!strcmp (httpfile->content_type, "text/html")) {
  266.                     char scheme[256], hostname[256], path[256], fname[256], query[256],
  267.                       anchor[256];
  268.                     int port;
  269.                     UrlSplit (httpfile->url, scheme, hostname, path, fname, query, anchor, &port);
  270.  
  271.                     McDbPrint ("ü£ éPâpâXû┌ : ");
  272.                     McDbPrint (httpfile->url);
  273.                     McDbPrint ("\n");
  274.                     if ((xptext = Html2Xpression (httpfile, NULL)) == NULL) {
  275.                         McPrint ("üª âeâLâXâgé╠ë≡É═é╔Ä╕ösé╡é▄é╡é╜\n");
  276.                         _dos_mfree (httpfile->content);
  277.                         _dos_mfree (httpfile);
  278.                         httpfile = NULL;
  279.                     }
  280.                     if (anchor[0]) {
  281.                         temp_line = SearchAnchor (xptext, anchor);
  282.                     }
  283.                 }
  284.                 /* .HTM éΓ .DOC/.TXT ê╚èOé≡ô╟é▌ì₧é±é╛ÅΩìçüi.Lzh ôÖüj */
  285.                 if ((httpfile != NULL)
  286.                     && (strcmp (httpfile->content_type, "text/html"))
  287.                     && (strcmp (httpfile->content_type, "text/plain"))
  288.                     && (old_xptext != NULL)) {
  289.                     ReCheckLinkTable (old_xptext);
  290.                     McDbPrint ("é▒é▒é▄é┼éαénéj\n");
  291.                     _dos_mfree (httpfile->content);
  292.                     xptext = NULL;
  293.                     McDbPrint ("é▒é▒é═üH\n");
  294.                 }
  295.                 if (xptext == NULL) {
  296.                     if (httpfile != NULL) {
  297.                         if (httpfile->content != NULL)
  298.                             _dos_mfree (httpfile->content);
  299.                         _dos_mfree (httpfile);
  300.                         httpfile = NULL;
  301.                     }
  302.                 }
  303.                 if (httpfile == NULL) {
  304.                     if (((httpfile = old_httpfile) != NULL) && ((xptext = old_xptext) != NULL))
  305.                         continue;
  306.                     else
  307.                         return (-1);
  308.                 }
  309.                 xptext->current_line = temp_line;
  310.  
  311.                 freeze = !0;    /* ëµû╩ìXÉVï╓Ä~ */
  312.                 disp_xptext = xptext;
  313.                 sp = _iocs_b_super (0);
  314.                 DispAll (disp_xptext);
  315.                 _iocs_b_super (sp);
  316.                 freeze = 0;    /* ëµû╩ìXÉVïûë┬ */
  317.  
  318.                 if (image_list_ptr != NULL) {
  319.                     if (image_list_ptr->data == NULL) {
  320.                         load_complete = 0;
  321.                     } else {
  322.                         if ((image_list_ptr->before_ptr) != NULL) {
  323.                             image_list_ptr = image_list_ptr->before_ptr;
  324.                             load_complete = 0;
  325.                         } else {
  326.                             if (t_option) {
  327.                                 char temp_str[256];
  328.                                 sprintf (temp_str, "ò`ëµÄ₧è╘ = %d\n", _iocs_ontime ()- lap_time);
  329.                                 McPrint (temp_str);
  330.                             }
  331.                             McPrint (STR_DISP_COMPLETE);
  332.                             load_complete = !0;
  333.                         }
  334.                     }
  335.                 } else {
  336.                     if (t_option) {
  337.                         char temp_str[256];
  338.                         sprintf (temp_str, "ò`ëµÄ₧è╘ = %d\n", _iocs_ontime ()- lap_time);
  339.                         McPrint (temp_str);
  340.                     }
  341.                     McPrint (STR_DISP_COMPLETE);
  342.                     load_complete = !0;
  343.                 }
  344.  
  345.                 /* é▒é▒é┼Åëé▀é─æOé╠ httpfile é≡Ä╠é─éΘ */
  346.                 if (old_httpfile != NULL) {
  347.                     if (old_httpfile->content != NULL)
  348.                         _dos_mfree (old_httpfile->content);
  349.                     _dos_mfree (old_httpfile);
  350.                 }
  351.                 FreeXptext2 (old_xptext);
  352.                 FreeXptext (old_xptext);
  353.                 old_httpfile = httpfile;
  354.                 old_xptext = xptext;
  355.  
  356.                 if (++save_counter > webcache_save)
  357.                     WCSave ();
  358.                 break;
  359.             } else {
  360.                 if (!load_complete) {
  361.                     int load_success = 0;    /* LoadImage() é╠ò╘éΦÆl */
  362.                     McDbPrint ("ü£ éQâpâXû┌ : ");
  363.                     McDbPrint (httpfile->url);
  364.                     McDbPrint ("\n");
  365.  
  366.                     if (image_list_ptr->data == NULL)
  367.                         load_success = LoadImage ();
  368.  
  369.                     if (image_list_ptr->before_ptr != NULL) {
  370.                         image_list_ptr = image_list_ptr->before_ptr;
  371.                     } else {
  372.                         if (t_option) {
  373.                             char temp_str[256];
  374.                             sprintf (temp_str, "ò`ëµÄ₧è╘ = %d\n", _iocs_ontime ()- lap_time);
  375.                             McPrint (temp_str);
  376.                         }
  377.                         McPrint (STR_DISP_COMPLETE);
  378.                         load_complete = !0;
  379.                     }
  380.                     temp_refresh_rate++;
  381.                     if ((load_complete)
  382.                         || ((load_success == 0) && (temp_refresh_rate >= refresh_rate))) {
  383.                         temp_refresh_rate = 0;
  384.                         xptext = Html2Xpression (httpfile, xptext);
  385.                         freeze = !0;    /* ëµû╩ìXÉVï╓Ä~ */
  386.                         xptext->current_line = disp_xptext->current_line;
  387.                         xptext->link_table = disp_xptext->link_table;
  388.                         xptext->link_table_buffer = disp_xptext->link_table_buffer;
  389.                         xptext->image_table = disp_xptext->image_table;
  390.                         disp_xptext = xptext;
  391.                         sp = _iocs_b_super (0);
  392.                         DispAll (disp_xptext);
  393.                         _iocs_b_super (sp);
  394.                         FreeXptext (old_xptext);
  395.                         old_xptext = xptext;
  396.                         freeze = 0;    /* ëµû╩ìXÉVïûë┬ */
  397.                     }
  398.                 }
  399.             }
  400.             break;
  401.  
  402.         case QUIT_RETURN:    /* ù╝âNâèâbâNé┼éPé┬æOé╔ */
  403.             {
  404.                 char *t;
  405.  
  406.                 freeze = !0;    /* ëµû╩ìXÉVï╓Ä~ */
  407.                 WaitReleaseAll ();
  408.                 if ((t = BeforeHistory (httpfile->url, &temp_line)) != NULL) {
  409.                     strcpy (url, t);
  410.                     httpfile = NULL;
  411.                     xptext = NULL;
  412.                 }
  413.                 quit_flag = QUIT_NON;
  414.                 freeze = 0;    /* ëµû╩ìXÉVïûë┬ */
  415.             }
  416.             break;
  417.  
  418.         case QUIT_LINK:/* â{â^âôé¬ëƒé│éΩé─âèâôâNɵé╓ */
  419.             {
  420.                 char scheme[256], hostname[256], path[256], fname[256], query[256], anchor[256];
  421.                 char scheme2[256], hostname2[256], path2[256], fname2[256], query2[256],
  422.                   anchor2[256];
  423.                 int port;
  424.                 int port2;
  425.  
  426.                 freeze = !0;    /* ëµû╩ìXÉVï╓Ä~ */
  427.                 WaitReleaseAll ();
  428.                 if (!load_complete) {
  429.                     image_list_ptr = image_list_top;
  430.                     load_complete = !0;
  431.                 }
  432.                 UrlSplit (url, scheme, hostname, path, fname, query, anchor, &port);
  433.                 UrlSplit ((disp_xptext->link_table)[in_link_num].url,
  434.                   scheme2, hostname2, path2, fname2, query2, anchor2, &port2);
  435.                 /* URL é¬ "#foo" üiâtâ@âCâïû╝é╚é╡üjé⌐üH */
  436.                 if ((*fname2 == '\0') && (*anchor2 == '#'))
  437.                     UrlCat (url, scheme, hostname, path, fname, query, anchor2, port);
  438.                 else
  439.                     UrlCat (url, scheme, hostname, path,
  440.                         (disp_xptext->link_table)[in_link_num].url, query, anchor, port);
  441.  
  442.                 AddHistory (url, httpfile->url, xptext->current_line);
  443.                 temp_line = 0;
  444.                 httpfile = NULL;
  445.                 xptext = NULL;
  446.                 quit_flag = QUIT_NON;
  447.                 freeze = 0;    /* ëµû╩ìXÉVïûë┬ */
  448.                 break;
  449.             }
  450.  
  451.         case QUIT_ABORT:    /* [ESC] é┼ô╟é▌ì₧é▌ÆåÆf */
  452.             freeze = !0;    /* ëµû╩ìXÉVï╓Ä~ */
  453.             WaitReleaseAll ();
  454.             if (!load_complete) {
  455.                 image_list_ptr = image_list_top;
  456.                 McPrint ("üª ÆåÆfé╡é▄é╡é╜\n");
  457.                 McPrint (STR_DISP_COMPLETE);
  458.                 load_complete = !0;
  459.             }
  460.             quit_flag = QUIT_NON;
  461.             freeze = 0;    /* ëµû╩ìXÉVïûë┬ */
  462.             break;
  463.  
  464.         case QUIT_TOUROKU:    /* [ôoÿ^] é┼âAâhâîâXÆáé╔ôoÿ^ */
  465.             freeze = !0;    /* ëµû╩ìXÉVï╓Ä~ */
  466.             WaitReleaseAll ();
  467.             AddAddress (httpfile->url, disp_xptext->title);
  468.             quit_flag = QUIT_NON;
  469.             freeze = 0;    /* ëµû╩ìXÉVïûë┬ */
  470.             break;
  471.  
  472.         case QUIT_ADDRESSBOOK:    /* [HOME] é¬ëƒé│éΩé─âAâhâîâXÆáé╓ */
  473.             freeze = !0;    /* ëµû╩ìXÉVï╓Ä~ */
  474.             WaitReleaseAll ();
  475.             if (!load_complete) {
  476.                 image_list_ptr = image_list_top;
  477.                 load_complete = !0;
  478.             }
  479.             temp_line = 0;
  480.             strcpy (url, address_book);
  481.  
  482.             httpfile = NULL;
  483.             xptext = NULL;
  484.             quit_flag = QUIT_NON;
  485.             freeze = 0;    /* ëµû╩ìXÉVïûë┬ */
  486.             break;
  487.  
  488.         case QUIT_REDRAW:
  489.             freeze = !0;    /* ëµû╩ìXÉVï╓Ä~ */
  490.             WaitReleaseAll ();
  491.             sp = _iocs_b_super (0);
  492.             hide_mouse_cursor ();
  493.             _iocs_b_super (sp);
  494.             ClearText ();
  495.             DispBack ();
  496.             sp = _iocs_b_super (0);
  497.             cut_disp (&WebPage2, (void *) (TEXTVRAM + (512 + 8 + 8) / 8 + 2 * 0x20000), 128);
  498.             cut_disp (&WebPage3, (void *) (TEXTVRAM + (512 + 8 + 8) / 8 + 3 * 0x20000), 128);
  499.             DispAll (disp_xptext);
  500.             show_mouse_cursor ();
  501.             _iocs_b_super (sp);
  502.             quit_flag = QUIT_NON;
  503.             freeze = 0;    /* ëµû╩ìXÉVïûë┬ */
  504.             break;
  505.  
  506.         case QUIT_TVERROR:
  507.             printf ("textview.s é┼âGâëü[ö¡É╢\n");
  508.             quit_flag = QUIT_EXIT;
  509.             break;
  510.  
  511.         case QUIT_PROCESS:
  512.             if (d_option) {
  513.                 spawnlp (P_WAIT, "PROCESS.X", "PROCESS.X", NULL);
  514.                 quit_flag = QUIT_EXIT;
  515.             } else {
  516.                 quit_flag = QUIT_NON;
  517.             }
  518.             break;
  519.  
  520.         case QUIT_DUMP:
  521.             if (d_option) {
  522.                 DumpXptext (xptext);
  523.                 quit_flag = QUIT_EXIT;
  524.             } else {
  525.                 quit_flag = QUIT_NON;
  526.             }
  527.  
  528.             break;
  529.  
  530.         case QUIT_EDIT:
  531.             freeze = !0;    /* ëµû╩ìXÉVï╓Ä~ */
  532.             WaitReleaseAll ();
  533.             if (!load_complete) {
  534.                 image_list_ptr = image_list_top;
  535.                 load_complete = !0;
  536.             }
  537.             temp_line = 0;
  538.             Tini2 ();
  539.             if (disp_xptext != NULL) {
  540.                 char temp_str[256];
  541.  
  542.                 sprintf (temp_str, &text_editor[0],
  543.                 ((disp_xptext->line_ptr)[disp_xptext->current_line]).org_line);
  544.                 strcat (temp_str, " ");
  545.                 if (!strnicmp (httpfile->url, "file://", 7))
  546.                     strcat (temp_str, (httpfile->url + 7));    /* file:// é≡ö≥é╬é╖ */
  547.                 else
  548.                     strcat (temp_str, httpfile->url);
  549.                 _toslash (temp_str);
  550.                 system (temp_str);    /* âeâLâXâgâGâfâBâ^ïNô« */
  551.             }
  552.             Init2 ();
  553.             strcpy (url, httpfile->url);
  554.             httpfile = NULL;
  555.             xptext = NULL;
  556.             freeze = 0;    /* ëµû╩ìXÉVïûë┬ */
  557.  
  558.             quit_flag = QUIT_NON;
  559.             break;
  560.  
  561.         case QUIT_SHELL:
  562.             freeze = !0;    /* ëµû╩ìXÉVï╓Ä~ */
  563.             WaitReleaseAll ();
  564.             Tini2 ();
  565.             system ("");    /* âVâFâïïNô« */
  566.             Init2 ();
  567.             strcpy (url, httpfile->url);
  568.             httpfile = NULL;
  569.             xptext = NULL;
  570.             freeze = 0;    /* ëµû╩ìXÉVïûë┬ */
  571.  
  572.             quit_flag = QUIT_NON;
  573.             break;
  574.  
  575.         case QUIT_EXIT:
  576.         default:
  577.             quit_flag = QUIT_EXIT;
  578.             break;
  579.         }
  580.     } while (quit_flag != QUIT_EXIT);
  581.  
  582.  
  583.     FreeXptext2 (xptext);
  584.     FreeXptext (xptext);
  585.     if (httpfile != NULL) {
  586.         if (httpfile->content != NULL)
  587.             _dos_mfree (httpfile->content);
  588.         _dos_mfree (httpfile);
  589.     }
  590.     return (0);
  591. }
  592.  
  593.  
  594. /* ïNô«Ä₧ïyé╤ÄqâvâìâZâXïNô«îπé╔î─é╬éΩéΘÅëè·ë╗âïü[â`âô */
  595. static void Init2 (void)
  596. {
  597.     int i;
  598.     int sp;
  599.     int palet_table[]=
  600.     {
  601.         0, 1, 2, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6
  602.     };
  603.  
  604.     unsigned short crtc_data[8] =
  605.     {
  606.         0x89, 0x0e, 0x1c, 0x7c, 0x237, 0x5, 0x028, 0x228
  607.     };
  608.     unsigned short *crtc_r0 = (unsigned short *) 0xe80000;
  609.     unsigned short *crtc_r20 = (unsigned short *) 0xe80028;
  610.     unsigned short *vctrl_r1 = (unsigned short *) 0xe82400;
  611.     unsigned short *vctrl_r2 = (unsigned short *) 0xe82500;
  612.     unsigned short *vctrl_r3 = (unsigned short *) 0xe82600;
  613.     unsigned short *p;
  614.  
  615.     _dos_c_width (5);    /* DOS âîâxâïé┼é═ 512x512 65536 ÉFâéü[âh */
  616.     _iocs_g_clr_on ();
  617.     _dos_c_curoff ();
  618.     _dos_c_locate (0, 30);
  619.     old_fnkmod = _dos_c_fnkmod (-1);
  620.     _dos_c_fnkmod (3);
  621.     _iocs_ms_init ();
  622.     _iocs_skey_mod (0, 0, 0);
  623.     _iocs_ms_limit (7, 7, 768 - 8, 512 - 8);
  624.     _iocs_tgusemd (0, 2);
  625.     _iocs_tgusemd (1, 2);
  626.  
  627.     sp = _iocs_b_super (0);
  628.     for (i = 0, p = crtc_r0; i < 8; i++)
  629.         *p++ = crtc_data[i];
  630.     *crtc_r20 = 0x0316;    /* 768x512 65536 ÉFÉ│ò√î`âéü[âhé╔ */
  631.     *vctrl_r1 = 0x0003;
  632.     *vctrl_r2 = 0x32e4;    /* 0x31e4 é╛é╞â_âüüH */
  633.     *vctrl_r3 = 0x002f;
  634.     _iocs_b_super (sp);
  635.  
  636.     for (i = 0; i < 16; i++)
  637.         _iocs_tpalet2 (i, (int) config_color[palet_table[i]]);
  638.     DispBack ();
  639.  
  640.     sp = _iocs_b_super (0);
  641.     cut_disp (&WebPage2, (void *) (TEXTVRAM + (512 + 8 + 8) / 8 + 2 * 0x20000), 128);
  642.     cut_disp (&WebPage3, (void *) (TEXTVRAM + (512 + 8 + 8) / 8 + 3 * 0x20000), 128);
  643.     _iocs_b_super (sp);
  644.  
  645.     disp_xptext = NULL;
  646.     _dos_breakck (2);    /* BREAK â`âFâbâNé≡ÄEé╖ */
  647.     _dos_intvcs (0xfff1, interrupt_abort);    /* _CTRLVC */
  648.     _dos_intvcs (0xfff2, interrupt_abort);    /* _ERRJVC */
  649.     _iocs_vdispst (TextVdisp, 0, 1);
  650. }
  651.  
  652.  
  653.  
  654. /* ïNô«Ä₧é╔éPôxé╛é»î─é╬éΩéΘÅëè·ë╗âïü[â`âô */
  655. static int Init (void)
  656. {
  657.     old_screen_mode = _dos_c_width (-1);
  658.     printf ("WebXpression ïNô«Æå...\n");
  659.     GetFileInit ();
  660.     McInit ();
  661.     printf ("WebCache.env é≡ô╟é▌ì₧é±é┼éóé▄é╖\n");
  662.     WCInit ();
  663.     InitHtml2Xpression ();
  664.     InitHistory ();
  665.     Init2 ();
  666.  
  667.     return (0);
  668. }
  669.  
  670.  
  671.  
  672. /* ÅIù╣Ä₧ïyé╤ÄqâvâìâZâXïNô«æOé╔î─é╬éΩéΘÅIù╣âïü[â`âô */
  673. static void Tini2 (void)
  674. {
  675.     _iocs_vdispst (0, 0, 0);
  676.     ClearText ();
  677.     _iocs_tgusemd (0, 3);
  678.     _iocs_tgusemd (1, 3);
  679.     _iocs_skey_mod (-1, 0, 0);
  680.     _iocs_ms_init ();
  681.     _dos_c_width (old_screen_mode);
  682.     _dos_kflushio (0xff);    /* âLü[âoâbâtâ@é≡âNâèâA */
  683.     _dos_c_fnkmod (old_fnkmod);
  684.     _dos_c_curon ();
  685. }
  686.  
  687.  
  688.  
  689. /* ÅIù╣Ä₧é╔éPôxé╛é»î─é╬éΩéΘÅIù╣âïü[â`âô */
  690. static int Tini (void)
  691. {
  692.     Tini2 ();
  693.     printf ("WebCache.env é≡ò█æ╢é╡é─éóé▄é╖\n");
  694.     WCTini ();
  695.  
  696.     return (0);
  697. }
  698.  
  699.  
  700.  
  701. int main (int argc, char *argv[])
  702. {
  703.     int i;
  704.     int slash_flag = 0;
  705.     char *fname = NULL;
  706.     char *cnf_fname = "WebXpression.cnf";
  707.     int exit_code = 0;
  708.  
  709.     {
  710.         char *temp;
  711.  
  712.         temp = getenv ("SLASH");
  713.         if ((temp != NULL) && (*temp == '/')) {
  714.             slash_flag = 1;
  715.         }
  716.     }
  717.  
  718.     for (i = 1; i < argc; i++) {
  719.         if (('-' == *argv[i]) || ((slash_flag == 0) && ('/' == *argv[i]))) {
  720.             switch (*(argv[i] + 1)) {
  721.  
  722.             case 'c':
  723.             case 'C':
  724.                 cnf_fname = argv[i] + 2;
  725.                 break;
  726.  
  727.             case 'd':
  728.             case 'D':
  729.                 d_option = !0;
  730.                 break;
  731.  
  732.             case 't':
  733.             case 'T':
  734.                 t_option = !0;
  735.                 break;
  736.  
  737.             default:
  738.                 usage ();
  739.                 return (-1);
  740.             }
  741.         } else {
  742.             fname = argv[i];
  743.         }
  744.     }
  745.  
  746.     mypsp = _dos_getpdb ();
  747.     strcpy (address_book, "file://");
  748.     strcat (address_book, mypsp->exe_path);
  749.     _addlastsep (address_book);
  750.     strcat (address_book, "AddressBook.htm");
  751.  
  752.  
  753.     if (fname == NULL)
  754.         fname = address_book;
  755.  
  756.     if (InitConfig (cnf_fname) < 0)
  757.         return (-1);
  758.  
  759.     if (!Init ())
  760.         exit_code = ShowHtml (fname);
  761.     Tini ();
  762.  
  763.     if (exit_code < 0) {
  764.         printf ("\n%s é¬î⌐é┬é⌐éΦé▄é╣é±\n", fname);
  765.         return (-1);
  766.     }
  767.     return (0);
  768. }
  769.